package com.github.kezhenxu94.playground.java.concurrent.executor;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * <pre>
 * 
 * {@link ScheduledExecutorService} 接口扩展了
 * {@link ExecutorService} 接口, 该接口提供了几个
 * 方法, 用于定时地执行或者周期性地执行一个任务.
 * 
 * 1. {@link ScheduledExecutorService#schedule(Runnable, long, TimeUnit)}
 * 在指定的延时之后执行 Runnable 代表的任务.
 * 
 * 2. {@link ScheduledExecutorService#schedule(Callable, long, TimeUnit)}
 * 在指定的延时之后执行 Callable 代表的任务.
 * 
 * 3. {@link ScheduledExecutorService#scheduleAtFixedRate(Runnable, long, long, TimeUnit)}
 * 在第二个参数指定的延时之后, 每隔第三个参数指定间隔
 * 周期性地执行第一个参数指定的任务.
 * 
 * </pre>
 * 
 * @author kezhenxu
 *
 */
public class StudyScheduledExecutorService {
	
	public static void main(String[] args) throws InterruptedException {
		ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
		
		// 1 秒后打印 Hello
		service.schedule(() -> System.out.println("Hello"), 1, TimeUnit.SECONDS);
		
		// 2 秒后，每隔 1 秒打印 World
		service.scheduleAtFixedRate(()->System.out.println("World"), 2, 1, TimeUnit.SECONDS);
		
		// 主线程等待 10 秒, 让 service 执行打印任务
		Thread.sleep(10000);
		
		service.shutdown();
	}
}
